package busterminal.persistence.jdbc.proxy;

import busterminal.entity.Bus;
import busterminal.entity.Route;
import busterminal.entity.Trip;
import busterminal.entity.service.TripState;
import busterminal.persistence.TripDAO;
import busterminal.services.ServiceLocator;
import java.text.ParseException;
import java.util.Date;

/**
 * Класс - заместитель рейса
 */
public class TripProxy implements Trip {

    /**
     * Идентификатор объекта в базе данных
     */
    private int id;
    /**
     * Proxy-объект рейса
     */
    private Trip proxyObject;

    /**
     * Конструктор по умолчанию
     */
    public TripProxy() {
    }

    /**
     * Получить proxy-объект: если он не загружен, то загрузить и получить
     * @return proxy-объект
     */
    private Trip getProxy() {
        if (proxyObject == null) {
            proxyObject = ServiceLocator.getService(TripDAO.class).read(id);
        }
        return proxyObject;
    }

    /**
     * Получить идентификатор
     * @return идентификатор
     */
    @Override
    public Integer getId() {
        return id;
    }

    /**
     * Установить идентификатор
     * @param id идентификатор
     */
    @Override
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * Получить автобус, который задействован в рейсе
     * @return автобус, который задействован в рейсе
     */
    @Override
    public Bus getBus() {
        return getProxy().getBus();
    }

    /**
     * Получить имя кондуктора
     * @return имя кондуктора
     */
    @Override
    public String getConductorName() {
        return getProxy().getConductorName();
    }

    /**
     * Получить имя водителя
     * @return имя водителя
     */
    @Override
    public String getDriverName() {
        return getProxy().getDriverName();
    }

    /**
     * Получить маршрут, по которому осуществляется рейс
     * @return маршрут, по которому осуществляется рейс
     */
    @Override
    public Route getRoute() {
        return getProxy().getRoute();
    }

    /**
     * Получить состояние рейса, определяемое константой из {@link TripState}
     * @return состояние рейса, определяемое константой из {@link TripState}
     */
    @Override
    public Date getTripDate() {
        return getProxy().getTripDate();
    }

    /**
     * Получить дату осуществления рейса
     * @return строка с датой осуществления рейса в формате <code>DD.MM.YYYY</code>
     */
    @Override
    public String getTripDateString() {
        return getProxy().getTripDateString();
    }

    /**
     * Получить дату осуществления рейса
     * @return дата осуществления рейса
     */
    @Override
    public TripState getTripState() {
        return getProxy().getTripState();
    }

    /**
     * Установить автобус, который задействован в рейсе
     * @param bus автобус, который задействован в рейсе
     */
    @Override
    public void setBus(Bus bus) {
        getProxy().setBus(bus);
    }

    /**
     * Установить имя кондуктора
     * @param conductorName имя кондуктора
     */
    @Override
    public void setConductorName(String conductorName) {
        getProxy().setConductorName(conductorName);
    }

    /**
     * Установить имя водителя
     * @param driverName имя водителя
     */
    @Override
    public void setDriverName(String driverName) {
        getProxy().setDriverName(driverName);
    }

    /**
     * Установить маршрут, по которому осуществляется рейс
     * @param route маршрут, по которому осуществляется рейс
     */
    @Override
    public void setRoute(Route route) {
        getProxy().setRoute(route);
    }

    /**
     * Установить дату осуществления рейса
     * @param tripDate дата осуществления рейса
     */
    @Override
    public void setTripDate(Date tripDate) {
        getProxy().setTripDate(tripDate);
    }

    /**
     * Установить дату осуществления рейса
     * @param tripDate строка с датой осуществления рейса в формате <code>DD.MM.YYYY</code>
     */
    @Override
    public void setTripDate(String tripDate) throws ParseException {
        getProxy().setTripDate(tripDate);
    }

    /**
     * Установить состояние рейса, определяемое константой из {@link TripState}
     * @param tripState состояние рейса, определяемое константой из {@link TripState}
     */
    @Override
    public void setTripState(TripState tripState) {
        getProxy().setTripState(tripState);
    }

    /**
     * Метод, возвращающий текстовое представление объекта
     * @return текстовое представление объекта
     */
    @Override
    public String toString() {
        return "TripProxy{" + "id=" + id + ", proxyObject=" + getProxy() + '}';
    }
}
